package lists

import (
	"errors"
	"youdu/model"
	modelJielong "youdu/model/jielong"
	modelYoudu "youdu/model/youdu"
)

func Find(cu modelYoudu.UserInfo, pager *model.Pagination, rows *[]modelJielong.Lists) error {
	ofs := pager.GetOffset()
	size := pager.PageSize
	db := model.Db.Model(&modelJielong.Lists{}).Where("creator_account = ?", cu.Account)
	// 查询总记录
	if err := db.Count(&pager.Total).Error; err != nil {
		return errors.New("查询总数失败：" + err.Error())
	}
	// 查询记录
	if err := db.Offset(ofs).Limit(size).Order("id DESC").Find(&rows).Error; err != nil {
		return errors.New("查询失败：" + err.Error())
	}
	return nil
}
func FindParticipate(cu modelYoudu.UserInfo, pager *model.Pagination, rows *[]modelJielong.Lists) error {
	// 查找我参与的列表
	ofs := pager.GetOffset()
	size := pager.PageSize
	tb1 := modelJielong.Lists{}.TableName()
	tb2 := modelJielong.ListUsers{}.TableName()
	db := model.Db.Model(&modelJielong.Lists{}).
		Joins("LEFT JOIN "+tb2+" ON "+tb1+".id = "+tb2+".list_id").
		Where(tb2+".user_account = ?", cu.Account)
	// 查询总记录
	if err := db.Count(&pager.Total).Error; err != nil {
		return errors.New("查询总数失败：" + err.Error())
	}
	// 查询数据
	err := db.Select(tb1 + ".*").
		Preload("Users").
		Offset(ofs).
		Limit(size).
		Order("id DESC").
		Find(&rows).Error
	if err != nil {
		return errors.New("查询记录失败：" + err.Error())
	}
	return nil
}
func FindItem(id interface{}, row *modelJielong.Lists) error {
	if err := model.Db.First(&row, id).Error; err != nil {
		return errors.New("查询接龙失败：" + err.Error())
	}
	return nil
}
func FindItemWithUsers(id interface{}, row *modelJielong.ItemWithUsers) error {
	if err := model.Db.First(&row.Item, id).Error; err != nil {
		return errors.New("查询接龙失败：" + err.Error())
	}
	// 查询接龙参与人列表
	if err := model.Db.Where("list_id = ?", id).Find(&row.Users).Error; err != nil {
		return errors.New("查询参与人失败：" + err.Error())
	}
	// 判断主表计数器字段是否和参与人数量一致
	l := len(row.Users)
	if row.Item.UsersCount != l {
		row.Item.UsersCount = l
		UpdateUsersCount(id, int64(l))
	}
	return nil
}

func Add(cu modelYoudu.UserInfo, user *modelJielong.Lists) error {
	user.CreatorAccount = cu.Account
	user.CreatorName = cu.ChsName
	result := model.Db.Create(&user)
	if result.Error != nil {
		return errors.New("创建失败：" + result.Error.Error())
	}
	return nil
}

func Update(li *modelJielong.Lists) error {
	data := modelJielong.Lists{
		Content: li.Content,
		Theme:   li.Theme,
		Fill:    li.Fill,
	}
	if err := model.Db.Model(&modelJielong.Lists{}).Where("id=?", li.ID).Updates(data).Error; err != nil {
		return errors.New("更新失败：" + err.Error())
	}
	return nil
}

// 根据id参数更新 Lists 表的 users_count 字段
func UpdateUsersCount(id interface{}, count int64) error {
	if count == 0 {
		if err := model.Db.Model(&modelJielong.ListUsers{}).Where("list_id = ?", id).Count(&count).Error; err != nil {
			return errors.New("查询计数器失败：" + err.Error())
		}
	}
	if err := model.Db.Model(&modelJielong.Lists{}).Where("id = ?", id).Update("users_count", count).Error; err != nil {
		return errors.New("更新计数器失败：" + err.Error())
	}
	return nil
}

func Del(id interface{}, cu modelYoudu.UserInfo) error {
	//todo 严格验证是否本人发起的，防止有心人随意得到别人的ID进行删除
	var row modelJielong.Lists
	if err := model.Db.First(&row, id).Error; err != nil {
		return errors.New("查询失败：" + err.Error())
	}
	if row.CreatorAccount != cu.Account {
		return errors.New("您不是发起人，不能删除")
	}
	// 删除记录
	if err := model.Db.Delete(&modelJielong.Lists{}, id).Error; err != nil {
		return errors.New("删除失败：" + err.Error())
	}
	return nil
}
